#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<iostream>
#include<mutex>
#include<thread>
using namespace std;

//饿汉模式
//class HungryModel
//{
//public:
//	static HungryModel& GetInstance()
//	{
//		cout << &_inst << endl;
//		return _inst;
//	}
//private:
//	HungryModel()
//	{
//		cout << "HungryModel()" << endl;
//	}
//	~HungryModel()
//	{
//		cout << "~HungryModel()" << endl;
//	}
//	HungryModel(const HungryModel&) = delete;
//	HungryModel& operator=(const HungryModel&) = delete;
//private:
//	static HungryModel  _inst;
//};
//
//HungryModel HungryModel::_inst;//类型 类域::成员

//懒汉模式
//class SlackerModel
//{
//public:
//	static volatile SlackerModel* GetInstance()
//	{
//		if (_inst == nullptr)
//		{
//			unique_lock<mutex> ul(_mtx);
//			if (_inst == nullptr)
//			{
//				cout << "first Instance" << endl;
//				_inst = new SlackerModel;
//			}
//		}
//		cout << &_inst << endl;
//		return _inst;
//	}
//private:
//	SlackerModel()
//	{
//		cout << "SlackerModel()" << endl;
//	}
//	~SlackerModel()
//	{
//		cout << "~SlackerModel()" << endl;
//	}
//	SlackerModel(const SlackerModel&) = delete;
//	SlackerModel& operator=(const SlackerModel&) = delete;
//private:
//	static volatile SlackerModel* _inst;
//	static mutex _mtx;
//};
//volatile SlackerModel* SlackerModel::_inst = nullptr; //类型 类域::对象
//mutex SlackerModel::_mtx;
//
//class SlackerModel_local
//{
//public:
//	static SlackerModel_local& GetInstance()
//	{
//		static SlackerModel_local inst;
//		cout << &inst << endl;
//		return inst;
//	}
//private:
//	SlackerModel_local()
//	{
//		cout << "SlackerModel_local()" << endl;
//	}
//	~SlackerModel_local()
//	{
//		cout << "~SlackerModel_local()" << endl;
//	}
//	SlackerModel_local(const SlackerModel_local&) = delete;
//	SlackerModel_local& operator=(const SlackerModel_local&) = delete;
//};
//void func()
//{
//	//HungryModel::GetInstance();
//	SlackerModel_local::GetInstance();
//}
//int main()
//{
//	thread t1(func);
//	thread t2(func);
//	t1.join();
//	t2.join();
//	return 0;
//}
#if 0
class Car
{
public:
	Car(string name) :_name(name)
	{}
	virtual void show() = 0;
private:
	string _name;
};
class Bmw :public Car
{
public:
	Bmw(string name) :Car(name) {}
	void show()
	{
		cout << "获取Bmw汽车" << endl;
	}
};
class Audi :public Car
{
public:
	Audi(string name) :Car(name) {}
	void show()
	{
		cout << "获取Audi汽车" << endl;
	}
};


class Factor
{
public:
	virtual Car* createCar(string name) = 0;//工厂方法
};
//宝马工厂
class BmwFactory :public Factor
{
public:
	Car* createCar(string name)
	{
		return new Bmw(name);
	}
};
class AudiFactory :public Factor
{
public:
	Car* createCar(string name)
	{
		return new Audi(name);
	}
};

int main()
{
	unique_ptr<Factor> bmwfactory(new BmwFactory());
	unique_ptr<Factor> audifactory(new AudiFactory());
	unique_ptr<Car> p1(bmwfactory->createCar("x6"));
	unique_ptr<Car> p2(audifactory->createCar("A8"));

	p1->show();
	p2->show();
	return 0;
}

//奥迪工厂
//enum CarType
//{
//	AUDI,
//	BMW
//};
//class SimpleFactory
//{
//public:
//	Car* createCar(CarType type)
//	{
//		switch (type)
//		{
//		case AUDI:
//			return new Audi("x1");
//			break;
//		case BMW:
//			return new Bmw("A6");
//			break;
//		default:
//			cerr << "传入工厂的参数错误" << endl;
//			break;
//		}
//		return nullptr;
//	}
//};
//
//int main()
//{
//	/*SimpleFactory* factory = new SimpleFactory();
//	Car* p1 = factory->createCar(BMW);
//	Car* p2 = factory->createCar(AUDI);
//	p1->show();
//	p2->show();
//
//	delete p1;
//	delete p2;
//	delete factory;*/
//
//	unique_ptr<SimpleFactory> factory(new SimpleFactory());
//	unique_ptr<Car> p1(factory->createCar(BMW));
//	unique_ptr<Car> p2(factory->createCar(AUDI));
//
//	p1->show();
//	p2->show();
//	return 0;
//}

#endif
//
//class Car
//{
//public:
//	Car(string name) :_name(name)
//	{}
//	virtual void show() = 0;
//private:
//	string _name;
//};
//class Bmw :public Car
//{
//public:
//	Bmw(string name) :Car(name) {}
//	void show()
//	{
//		cout << "获取Bmw汽车" << endl;
//	}
//};
//class Audi :public Car
//{
//public:
//	Audi(string name) :Car(name) {}
//	void show()
//	{
//		cout << "获取Audi汽车" << endl;
//	}
//};
//
//
////系列产品2
//class Light
//{
//public:
//	virtual void show() = 0;
//};
//class BmwLight :public Light
//{
//public:
//	void show() { cout << "BMW light!" << endl; }
//};
//class AudiLight :public Light
//{
//public:
//	void show() { cout << "Audi Light!" << endl; }
//};
//
////工厂方法 => 抽象工厂（对有一组关联关系的产品蔟提供产品对象的统一创建）
//class AbstractFactory
//{
//public:
//	virtual Car* createCar(string name) = 0; //工厂方法：创建汽车
//	virtual Light* createCarLight() = 0; //工厂方法 创建汽车关联的产品=>车灯
//};
//
////宝马工厂
//class BMWFactory :public AbstractFactory
//{
//public:
//	Car* createCar(string name)
//	{
//		return new Bmw(name);
//	}
//	Light* createCarLight()
//	{
//		return new BmwLight();
//	}
//};
//
////奥迪工厂
//class AudiFactory :public AbstractFactory
//{
//public:
//	Car* createCar(string name)
//	{
//		return new Audi(name);
//	}
//	Light* createCarLight()
//	{
//		return new AudiLight();
//	}
//};
//
//int main()
//{
//	//一类产品 => 有关联关系的系列产品
//	unique_ptr<AbstractFactory> bmwfty(new BMWFactory());
//	unique_ptr<AbstractFactory> audifty(new AudiFactory());
//
//	unique_ptr<Car> p1(bmwfty->createCar("x6"));
//	unique_ptr<Car> p2(audifty->createCar("A8"));
//
//	unique_ptr<Light> l1(bmwfty->createCarLight());
//	unique_ptr<Light> l2(bmwfty->createCarLight());
//
//	p1->show(); 
//	l1->show();
//
//	p2->show();
//	l2->show();
//
//	return 0;
//}



